package com.sg.util.demo;

import org.joda.time.*;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;

import java.util.Date;
import java.util.Locale;

/**
 * 日期操作demo
 * <p>此demo使用joda-time 第三方jar，具体操作相比于jdk原生 Date和Calendar简单，具体操作见下方demo</p>
 * @author xzk
 * @date 2017.12.07
 */
public class JodaTimeDemo {
	
    @SuppressWarnings("unused")
	public static void main(String[] args) {
    	
        /**
         * 初始化日期
         */
        //获取当前时间
        DateTime datetime = new DateTime();
        // 年,月,日,时,分,秒
        DateTime datetime1 = new DateTime(2017,12,6,10,48,25);
        // 年,月,日,时,分,秒,毫秒
        DateTime datatime2 = new DateTime(2017,12,6,10,48,25,300);
        //输出==>年-月-日 时：分：秒.毫秒（格式化方式和dataFormat类似）
        String dateStr = datetime1.toString("yyyy-MM-dd HH:mm:ss.SSa");
        //输出==>年/月/日 时：分：秒 星期
        String dateStr2 = datatime2.toString("yyyy/MM/dd HH:mm:ss EE");
        //格式化带Locale，输出==> 2012年12月21日 23:22:45
        String string_c = datatime2.toString("yyyy年MM月dd日 HH:mm:ss EE", Locale.CHINESE);

        /**
         * 日期格式化
         */
        DateTimeFormatter dateFormat = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss");
        DateTime dateTime = DateTime.parse("2017-10-20 12:50:03",dateFormat);

        // 根据指定格式,将时间字符串转换成DateTime对象,这里的格式和上面的输出格式是一样的
        DateTime dt2 = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss").parseDateTime("2017-11-26 05:30:00");

        /**
         * 日期计算
         */
        //计算两个时间之间间隔的天数
        LocalDate start = new LocalDate(2017,10,01);
        LocalDate end = new LocalDate(2017,11,01);

        int days = Days.daysBetween(start,end).getDays();

        DateTime start1 = new DateTime(2017,10,01,15,20,05);
        DateTime end1 = new DateTime(2017,11,01,15,20,05);

        //年差
        int years1 = Years.yearsBetween(start1,end1).getYears();
        //月差
        int month1 = Months.monthsBetween(start1,end1).getMonths();
        //天差
        int days1 = Days.daysBetween(start1,end1).getDays();
        //时差
        int hous1 = Hours.hoursBetween(start1,end1).getHours();
        //分差
        int mins1 = Minutes.minutesBetween(start1,end1).getMinutes();
        //秒差
        int seconds1 = Seconds.secondsBetween(start1,end1).getSeconds();
       
        /**
         * 增加日期
         */
        DateTime pluDdatetime = new DateTime();
        //加1年
        pluDdatetime.plusYears(1);
        //加1个月
        pluDdatetime.plusMonths(1);
        //加1个天
        pluDdatetime.plusDays(1);
        //加1小时
        pluDdatetime.plusHours(1);
        //加1分钟
        pluDdatetime.plusMinutes(1);
        //加1秒
        pluDdatetime.plusSeconds(1);
        //加1毫秒
        pluDdatetime.plusMillis(1);

        //减法类似-减一个小时
        pluDdatetime.minusHours(1);

        //链式操作
        //加1年
        pluDdatetime.plusYears(1)
                //加1个月
                .plusMonths(1)
                //加1个天
                .plusDays(1)
                //加1小时
                .plusHours(1)
                //加1分钟
                .plusMinutes(1)
                //加1秒
                .plusSeconds(1)
                //加1毫秒
                .plusMillis(1)
                //减一个小时
                .minusHours(1);

        //判断是否闰月
        DateTime dt4 = new DateTime();
        org.joda.time.DateTime.Property month = dt4.monthOfYear();
        System.out.println("是否闰月:" + month.isLeap());

        //取得 3秒前的时间
        DateTime dt5 = datetime1.secondOfMinute().addToCopy(-3);

        //获取当前日期是本年第几天
        System.out.println( dt5.getDayOfYear());
        //获取当前日期是本月第几天
        System.out.println( dt5.getDayOfMonth());
        //获取当前日期是本周第几天
        System.out.println( dt5.getDayOfWeek());
        //获取当前日期是本的第多少毫秒
        System.out.println( dt5.getMillisOfDay());

        // DateTime与java.util.Date对象,当前系统TimeMillis转换
        DateTime dt6 = new DateTime(new Date());
        Date date = dt6.toDate();
        DateTime dt7 = new DateTime(System.currentTimeMillis());
        dt6.getMillis();
    }
}
